﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;

namespace youzackcom.Permissions
{
    public class CustomPermissionDefinitionProvider : PermissionDefinitionProvider
    {
        /// <summary>
        /// 定义权限
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>
        public override void Define(IPermissionDefinitionContext context)
        {
            #region abp 定义权限 、权限校验、权限授权 原理
            {
                //1、权限定义原理。
                //IPermissionDefinitionManager(提供权限） 权限管理
                //------ > IStaticPermissionDefinitionStore  权限存储
                //------ > IPermissionDefinitionProvider  权限定义
                //----->PermissionDefinition



                // 存储
                //2、权限存储原理。定义的权限。存储到数据库  Abp.PermissionManagement.DomainModule，初始化中间件注册
                //Abp.PermissionManagement.DomainModule
                //------>IStaticPermissionSaver
                //---- > IStaticPermissionDefinitionStore
                //---- > IPermissionDefinitionRecordRepository
                //---- > IPermissionGroupDefinitionRecordRepository



                //3、权限授权原理。就是从权限表中，把权限存储到sys_permissiongrants
                //IPermissionManager
                //----->IPermissionDefinitionManager(提供权限)
                //---- > IPermissionManagementProvider--->UserEamilPermissionManagementProvider
                //---- > UserPermissionManagementProvider
                //---- > RolePermissionManagementProvider
                //Name （权限提供者自定义）
                //----->IPermissionGrantRepository--->EfCorePermissionGrantRepository
                //（权限存储）



                //4、鉴权原理。 根据用户信息查询sys_permissiongrants表是否有授权数据。
                //IAbpAuthorizationService--->AbpAuthorizationService
                //---- > AbpAuthorizationServiceExtensions
                //----->IAuthorizationService--->DefaultAuthorizationService
                //---- > IAuthorizationHandler--->PermissionRequirementHandler

                //核心代码）
                //----> IPermissionChecker-- PermissionChecker
                //---- > IsGrantedAsync（）方法
                //--->PermissionDefinitionManager(查询定义的权限)
                //---- > IPermissionValueProviderManager
                //--->IPermissionValueProvider---- > UserEamilPermissionValueProvider "UserEamil"
                //---- > UserPermissionValueProvider"U"
                //---- > RolePermissionValueProvider "R"
                //---- > ClientPermissionValueProvider "C"

                //Volo.Abp.PermissionManagement.Domain(权限管理模块)
                //--->IPermissionStore(去数据库查询，查询权限) （具体的实现）----> PermissionStore
                //---- > IPermissionGrantRepository
                //----->IDistributedCache(分布式缓存)默认存储在本地



                //5、特性鉴权原理 配置特性方式授权。AOP。
                //AuthorizationInterceptorRegistrar---- > 注册拦截哪一个特性。以及哪一个拦截器
                //---- > AuthorizationInterceptor---- > --> AbpInterceptor(Volo.Abp.DynamicProxy 命名空间中)
                //---- > IMethodInvocationAuthorizationService
                //---- > MethodInvocationAuthorizationService(进行鉴权)
                //---- > AlwaysAllowMethodInvocationAuthorizationService(不进行鉴权)
                //--->IAbpAuthorizationService
            }
            #endregion

            //定义业务模块 ， 定义权限组
            PermissionGroupDefinition permissionGroupDefinition = context.AddGroup("Products");
            //定义具体权限(商品查询权限)
            var prodcutMange = permissionGroupDefinition.AddPermission("Product.Mange");
            prodcutMange.AddChild("Product.Mange.Select");
            prodcutMange.AddChild("Product.Mange.Delete");
            prodcutMange.AddChild("Product.Mange.Update");
            prodcutMange.AddChild("Product.Mange.Insert");
            prodcutMange.AddChild("Product.Mange.Page");

            //定义一级、二级权限
            PermissionGroupDefinition permissionGroupDefinition1 = context.AddGroup("Order");
            //一级权限
            PermissionDefinition permissionDefinition = permissionGroupDefinition1.AddPermission("Order.Mange");
            //二级权限
            PermissionDefinition permissionDefinition1 = permissionDefinition.AddChild("Order.Mange.Insert");

            //角色权限测试
            PermissionGroupDefinition permissionGroupDefinition2 = context.AddGroup("RoleAuthorize");
            //一级权限
            PermissionDefinition permissionDefinition2 = permissionGroupDefinition2.AddPermission("RoleAuthorize.Mange");
            //二级权限
            permissionDefinition2.AddChild("RoleAuthorize.Mange.Create");
            permissionDefinition2.AddChild("RoleAuthorize.Mange.Insert");
            permissionDefinition2.AddChild("RoleAuthorize.Mange.Update");
            permissionDefinition2.AddChild("RoleAuthorize.Mange.Delete");
        }
    }
}
